home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / telecomm / sticpsrc.lzh / SOURCE.ARC / LCSUM.C < prev    next >
C/C++ Source or Header  |  1990-03-13  |  2KB  |  87 lines

  1. #include "global.h"
  2. /*
  3.  * Word aligned linear buffer checksum routine.     Called from mbuf checksum
  4.  * routine with simple args.  Intent is that this routine may be replaced
  5.  * by assembly language routine for speed if so desired.
  6.  * Speeded up by PE1CHL, assy is now not worthwile for 68000
  7.  */
  8. int16
  9. lcsum(wp,len)
  10. register int16 *wp;
  11. register int16 len;
  12. {
  13.     int16 eac();
  14.     register int32 sum = 0;
  15. #ifdef    LITTLE_ENDIAN
  16.     int16 result;
  17. #endif
  18.  
  19.     switch (len & 0x0f)            /* handle length % 16 */
  20.     {
  21.     case 15:
  22.         sum += *wp++;
  23.     case 14:
  24.         sum += *wp++;
  25.     case 13:
  26.         sum += *wp++;
  27.     case 12:
  28.         sum += *wp++;
  29.     case 11:
  30.         sum += *wp++;
  31.     case 10:
  32.         sum += *wp++;
  33.     case 9:
  34.         sum += *wp++;
  35.     case 8:
  36.         sum += *wp++;
  37.     case 7:
  38.         sum += *wp++;
  39.     case 6:
  40.         sum += *wp++;
  41.     case 5:
  42.         sum += *wp++;
  43.     case 4:
  44.         sum += *wp++;
  45.     case 3:
  46.         sum += *wp++;
  47.     case 2:
  48.         sum += *wp++;
  49.     case 1:
  50.         sum += *wp++;
  51.         len &= ~0x0f;
  52.     case 0:
  53.         break;
  54.     }
  55.  
  56.     if (len != 0)                /* still more blocks of 16? */
  57.     do
  58.     {
  59.         sum += *wp++;            /* then add 16 words quickly */
  60.         sum += *wp++;
  61.         sum += *wp++;
  62.         sum += *wp++;
  63.         sum += *wp++;
  64.         sum += *wp++;
  65.         sum += *wp++;
  66.         sum += *wp++;
  67.         sum += *wp++;
  68.         sum += *wp++;
  69.         sum += *wp++;
  70.         sum += *wp++;
  71.         sum += *wp++;
  72.         sum += *wp++;
  73.         sum += *wp++;
  74.         sum += *wp++;
  75.     } while (len -= 16);            /* while more to go */
  76.  
  77. #ifdef    LITTLE_ENDIAN
  78.     result = eac(sum);
  79.     /* Swap the result because of the (char *) to (int *) type punning */
  80.     result = (result << 8) | (result >> 8);
  81.     return result;
  82. #else
  83.     return eac(sum);
  84. #endif
  85. }
  86.  
  87.